import 'package:convergence_media/di/di.dart';
import 'package:convergence_media/features/user/entities/token_model.dart';
import 'package:isar/isar.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'token_repository.g.dart';

@riverpod
TokenRepository tokenRepository(TokenRepositoryRef ref) => TokenRepository(
      isar: ref.watch(appIsarProvider),
    );

/// {@template token_repository}
/// 管理所有的token值
/// {@endtemplate}
class TokenRepository {
  /// {@macro token_repository}
  TokenRepository({
    required Isar isar,
  }) : _isar = isar;

  final Isar _isar;

  /// 获取统一认证登录的 token，空为不存在
  Future<String?> getMainToken(Id id) async {
    final tokenModel = await _isar.tokenModels.get(id);
    return tokenModel?.mainToken;
  }

  /// 获取圈子的 token，空为不存在
  Future<String?> getCircleToken(Id id) async {
    final tokenModel = await _isar.tokenModels.get(id);
    return tokenModel?.circleToken;
  }

  /// 获取新闻的 token，空为不存在
  Future<String?> getNewsToken(Id id) async {
    final tokenModel = await _isar.tokenModels.get(id);
    return tokenModel?.newsToken;
  }

  /// 设置主 token
  Future<Id> putMainToken(Id id, String token) async {
    final tokenModel = await _isar.tokenModels.get(id);

    return _isar.writeTxn(
      () => _isar.tokenModels.put(
        tokenModel!.copyWith(mainToken: token),
      ),
    );
  }

  /// 设置圈子 token
  Future<Id> putCircleToken(Id id, String token) async {
    final tokenModel = await _isar.tokenModels.get(id);

    return _isar.writeTxn(
      () => _isar.tokenModels.put(
        tokenModel!.copyWith(circleToken: token),
      ),
    );
  }

  /// 设置新闻 token
  Future<Id> putNewsToken(Id id, String token) async {
    final tokenModel = await _isar.tokenModels.get(id);

    return _isar.writeTxn(
      () => _isar.tokenModels.put(
        tokenModel!.copyWith(newsToken: token),
      ),
    );
  }

  Future<Id> initTokenModel(String phoneNumber) {
    return _isar.writeTxn(
      () => _isar.tokenModels.put(
        TokenModel(phoneNumber: phoneNumber),
      ),
    );
  }

  /// 检查是否登录
  Future<bool> isLogin(Id id) async {
    final mainToken = await getMainToken(id);
    return mainToken != null;
  }
}
